package scene;
import java.awt.*;

/**
 * Filet de selection, permet de tracer un rectangle de selection
 * Le constructeur prend en parametre le point de depart
 * puis il suffit de d'utiliser la methode setPointDestination pour 
 * definir le point de destination
 * 
 * @author Delmas Gabriel
 */
public class RectangleSelection
{
	/**
	 * Point d'origine du rectangle
	 */
	private Point pDeb;
	
	/**
	 * Point de destination du rectangle
	 */
	private Point pFin;
	
	/**
	 * Rectangle de selection
	 */
	private Rectangle rect_select;
	
	/**
	 * Permet d'activer ou non la transparence
	 */
	private boolean transparenceActive;
	
	/**
	 * Constructeur prenant en parametre le point d'origine du rectangle de selection
	 * @param pNouv le point d'origine
	 */
	public RectangleSelection(Point pNouv)
	{
		this.transparenceActive=true;
		this.pDeb=pNouv;
		this.pFin=pNouv;
		rect_select = new Rectangle(this.pDeb.x,this.pDeb.y,0,0);
	}
	
	/**
	 * Retourne si la transparence est active
	 * @return boolean true si active
	 */
	public boolean getTransparenceActive(){return this.transparenceActive;}
	
	/**
	 * Permet de configurer la transparence
	 * @param transparence boolean true si active
	 */
	public void setTransparenceActive(boolean transparence){this.transparenceActive=transparence;}
	
	/**
	 * Permet de construire le rectangle a afficher
	 */
	private void ConstructionRectangle()
	{
		int x,y,largeur,hauteur;

		if(this.pDeb.x<this.pFin.x)
		{
			x=this.pDeb.x;
			largeur=this.pFin.x-this.pDeb.x;
		}
		else
		{
			x=this.pFin.x;
			largeur=this.pDeb.x-this.pFin.x;
		}
		if(this.pDeb.y<this.pFin.y)
		{
			y=this.pDeb.y;
			hauteur=this.pFin.y-this.pDeb.y;
		}
		else
		{
			y=this.pFin.y;
			hauteur=this.pDeb.y-this.pFin.y;
		}
		
		rect_select = new Rectangle(x,y,largeur,hauteur);
	}
	/**
	 * Retourne les coordonnees et les dimensions du rectangle de selection
	 * @return Rectangle qui correspond aux coordonnees et dimensions
	 */
	public Rectangle getRectangle(){return rect_select;}
	
	/**
	 * Permet de definir le point de destination du rectangle de selection
	 * @param pDest point de destination
	 */
	public void setPointDestination(Point pDest)
	{
		pFin=pDest;
		ConstructionRectangle();
	}
	
	/**
	 * Affiche le rectangle de selection sur le contexte graphique
	 * @param g2d contexte graphique
	 */
	public void dessiner(Graphics2D g2d)
	{
		Color originalCouleur = g2d.getColor();
		g2d.setColor(Color.blue);
		g2d.drawRect(rect_select.x, rect_select.y, rect_select.width, rect_select.height);
		g2d.setColor(originalCouleur);
		
		if(this.transparenceActive)
			dessinerRectangle(g2d, 0.2F);
	}
	
	/**
	 * Permet de dessiner le contenu transparent du rectangle de selection
	 * @param g2d contexte graphique
	 * @param alpha coefficient de transparence
	 */
	private void dessinerRectangle(Graphics2D g2d, float alpha)
	{
		Composite originalComposite = g2d.getComposite();
		g2d.setComposite(makeComposite(alpha));
		g2d.setPaint(Color.blue);
		g2d.fill(rect_select);
		
		g2d.setComposite(originalComposite);
	}
	
	/**
	 * Gere la transparence
	 * @param alpha coefficient de transparence
	 * @return
	 */
	private AlphaComposite makeComposite(float alpha)
	{
		int type = AlphaComposite.SRC_OVER;
		return(AlphaComposite.getInstance(type, alpha));
	}
}
